package oop.controller.action.mark;

import java.sql.SQLException;
import java.text.ParseException;
import java.util.Date;
import java.util.List;

import oop.controller.action.DefaultAction;
import oop.data.Mark;
import oop.data.TestVersion;
import oop.db.dao.MarkDAO;
import oop.db.dao.TestVersionDAO;
import oop.taglib.UtilFunctions;

import com.oreilly.servlet.ParameterNotFoundException;

public class EditAction extends DefaultAction {
	private Mark mark;
	private List<TestVersion> versions;

	@Override
	public void performImpl() throws Exception {
		try {
			mark = MarkDAO.fetchById(getParams().getLong("me_id"));
			versions = TestVersionDAO.fetchByTest(mark.getExamination().getTest().getId());
			title("Sửa thông tin bài làm của sinh viên " + UtilFunctions.shortStudentInfo(mark));

			String submit = request.getParameter("me_submit");
			if ("save".equals(submit)) {
				doEdit();
			}
		} catch (NumberFormatException ex) {
			request.setAttribute("message", "id không hợp lệ");
			setNextAction("error");
		}
	}

	private void doEdit() throws SQLException {
		TestVersion testVersion;
		try {
			testVersion = TestVersionDAO.fetchById(getParams()
					.getLong("me_version"));
		} catch (NumberFormatException e) {
			versionError = "Mã số phiên bản đề không hợp lệ.";
			return;
		} catch (ParameterNotFoundException e) {
			versionError = "Bạn cần chọn phiên bản đề.";
			return;
		}

		String studentName;
		try {
			studentName = getParams().getString("me_name");
		} catch (ParameterNotFoundException e) {
			studentNameError = "Bạn cần chọn phiên bản đề.";
			return;
		}
		String studentSurname = request.getParameter("me_surname");
		String studentId = request.getParameter("me_sid");

		Date studentBirthday;
		try {
			studentBirthday = UtilFunctions.parseDate(getParams().getString("me_sbirthday"));
		} catch (ParameterNotFoundException ex) {
			studentBirthday = null;
		} catch (ParseException e) {
			studentBirthdayError = "Định dạng ngày sinh không hợp lệ.";
			return;
		}

		List<Mark> marks = MarkDAO.fetchByStudentInfo(studentName,
				studentSurname, studentId, studentBirthday);
		if (!marks.isEmpty()
				&& !(marks.size() == 1 && marks.get(0).getId() == mark.getId())) {
			studentNameError = "Sinh viên đã có trong danh sách.";
			return;
		}
		
		mark.setTestVersion(testVersion);
		mark.setStudentName(studentName);
		mark.setStudentSurname(studentSurname);
		mark.setStudentId(studentId);
		mark.setStudentBirthday(studentBirthday);
		MarkDAO.persist(mark);
		setNextAction("mark.view&mv_id=" + mark.getId());
	}

	private String versionError;
	private String studentNameError;
	private String studentBirthdayError;

	public String getVersionError() {
		return versionError;
	}

	public String getStudentBirthdayError() {
		return studentBirthdayError;
	}

	public String getStudentNameError() {
		return studentNameError;
	}

	public Mark getMark() {
		return mark;
	}
	
	public List<TestVersion> getVersions() {
		return versions;
	}
	
}
